#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget




from scp.modelo.models import DBSession
from scp.modelo.Proyecto import Proyecto
from scp.modelo.Usuario import Usuario
from scp.modelo.Fase import Fase
from scp.modelo.Recurso import Recurso
from scp.modelo.Rol import Rol
from scp.modelo.AsignacionRecurso import AsignacionRecurso
from scp.modelo.Item import Item

from pyramid.response import Response
from pyramid.view import view_config
import json

import re

#@view_config(renderer='json')
def proyectos(request):
	"""Método controlador encargado de la administración de los Proyectos.
		URL asociada: /proyectos/{operacion}
		operacion:
			view, listado de proyectos
			create, creación de un nuevo proyecto
			update, edición de un proyecto
			anular, anulación de proyecto
			iniciar, activación del proyecto
			finalizar, finalización del proyecto
		@param request: Petición Http del cliente. 	
	"""

	print ">>>>>>>>>>>>>Controlador de Proyectos - Inicio>>>>>>>>>>>>>>"
	print "request:"
	print request

	print '>>>>>>>>>>>>>>>request.metodo<<<<<<<<<<<<<<<<<<<<<<'
	
	methodRequest = request.method
	print methodRequest
	
	print '>>>>>>>>>>>>>>request.url<<<<<<<<<<<<<<<<<<<<<<<<<<'
	
	print request.url
	
	
	print '>>>>>>>>>>>>>>>reles_url<<<<<<<<<<<<<<<<<<<'
	
	print '>>>>>>>>>>>>>>request_matchdict<<<<<<<<<<<<'
	
	dicParametros = request.matchdict
	
	print request.matchdict
	print '>>>>>>>>>>>>>>request_matchdict<<<<<<<<<<<<'
	
	proyectos_url = request.route_url('proyectos', operacion=1)
	print proyectos_url
	
	print "parametros abajo..."
	print request.params
	
	print 'request.body'
	print request.body 
	

	print "operaciónnnnnnnn"
	print dicParametros.get('operacion')
	print "operaciónnnnnnnn"
	
	
	if dicParametros.get('operacion') == 'update' or dicParametros.get('operacion') == 'create':
		print 'entre el if de update'
		
		print 'json.loads(request.params[proyecto])'
		proyecto = json.loads(request.params['proyecto'])
		print json.loads(request.params['proyecto'])
		print 'proyecto.data'
		proyectoData = proyecto.get('data')
		print proyecto.get('data')
		print 'proyecto.data.nombreProyecto'
		print proyectoData.get('nombreProyecto')
		
	
	print 'dicParametros.get(operacion).find(?):' 
	print dicParametros.get('operacion').find('?')
	
	session = DBSession()
	if dicParametros.get('operacion') == 'view' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	elif dicParametros.get('operacion') == 'view':
		proyectosAll = session.query(Proyecto).all()
		
		proyectosArray = []
		for proyectoIter in proyectosAll: 
			aux = {'idProyecto': proyectoIter.id, 'nombreProyecto': proyectoIter.nombre, 'descripProyecto':proyectoIter.descripcion, 'fecIniProyecto':proyectoIter.fecha_inicio, 'estado':proyectoIter.estado}
			proyectosArray.append(aux)
		
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, proyectos = proyectosArray))
		responseView.content_type = 'application/json'
		
		print 'respondí con un Responseeeee!!!'
		return responseView
	elif dicParametros.get('operacion') == 'create':
		print 'json.loads(request.params[ids_usuario])'
		usuario = json.loads(request.params['id_usuario'])
		print usuario
		responseCreate = Response()
		proyectoNombre = session.query(Proyecto).filter_by(nombre=proyectoData.get('nombreProyecto')).first()
		if proyectoNombre is None:
			proyecto = Proyecto()
			proyecto.nombre = proyectoData.get('nombreProyecto')
			proyecto.descripcion = proyectoData.get('descripProyecto')
			proyecto.fecha_inicio = proyectoData.get('fecIniProyecto')
			proyecto.estado = "PENDIENTE"
			
			lider = []
			usuarioLider = session.query(Usuario).filter_by(id=usuario).first()
			lider.append(usuarioLider)
			proyecto.usuarios = lider
			
			session.add(proyecto)
			
			recurso = Recurso()
			recurso.tipo = "P"
			recurso.proyecto = proyecto
			session.add(recurso)	
			
			rolLider = session.query(Rol).filter_by(nombre="Lider de Proyecto").first()
			rolUsuario = []
			rolUsuario.append(rolLider)
			usuarioLider.roles = rolUsuario
			
			asigRecurso = AsignacionRecurso()
			asigRecurso.recurso = recurso
			asigRecurso.usaurio = usuarioLider
			asigRecurso.rol = rolLider
			
			session.add(asigRecurso)
		
			
			responseCreate.body = json.dumps(dict(success = True))
			responseCreate.content_type = 'application/json'	
		else:
			responseCreate.body = json.dumps(dict(success = False, msg = 'Ya existe un nombre de proyecto igual!!!'))
			responseCreate.content_type = 'application/json'
			
		return responseCreate
	elif dicParametros.get('operacion') == 'update':
		responseUpdate = Response()
		proyectoNombre = session.query(Proyecto).filter_by(nombre=proyectoData.get('nombreProyecto')).first()
		proyectoUpdate = session.query(Proyecto).filter_by(id=proyectoData.get('idProyecto')).first()
		if proyectoNombre is not None and proyectoNombre.id != proyectoUpdate.id:
			responseUpdate.body = json.dumps(dict(success = False, msg = 'Ya existe un nombre de proyecto igual!!!'))
			responseUpdate.content_type = 'application/json'
		else:	
			proyectoUpdate.nombre = proyectoData.get('nombreProyecto')
			proyectoUpdate.descripcion = proyectoData.get('descripProyecto')
			proyectoUpdate.fecha_inicio = proyectoData.get('fecIniProyecto')
			
			responseUpdate.body = json.dumps(dict(success = True, ))
			responseUpdate.content_type = 'application/json'
			
		return responseUpdate
	
	elif dicParametros.get('operacion') == 'anular':
		
		idProyectoAnular = json.loads(request.params['param_id'])
		proyectoAnular = session.query(Proyecto).filter_by(id=idProyectoAnular).first()
		proyectoAnular.estado = 'ANULADO'
		
		responseAnular = Response()
		responseAnular.body = json.dumps(dict(success = True))
		responseAnular.content_type = 'application/json'
		return responseAnular
			
	elif dicParametros.get('operacion') == 'iniciar':
		
		idProyectoIniciar = json.loads(request.params['param_id'])
		proyectoIniciar = session.query(Proyecto).filter_by(id=idProyectoIniciar).first()
		fase = session.query(Fase).filter_by(proyecto_id=idProyectoIniciar).first()
		
		responseIniciar = Response()
		
		if fase is not None:
			proyectoIniciar.estado = 'ACTIVO'
			fases = proyectoIniciar.fases
			for faseIter in fases:
				faseIter.estado = 'ACTIVA'
				
			responseIniciar.body = json.dumps(dict(success = True))
		else:
			responseIniciar.body = json.dumps(dict(success = False, msg = "El proyecto no tiene ninguna Fase asociada!!!"))
			
		responseIniciar.content_type = 'application/json'
		return responseIniciar
	
	elif dicParametros.get('operacion') == 'finalizar':
		
		idProyectoFinalizar = json.loads(request.params['param_id'])
		fases = session.query(Fase).filter_by(proyecto_id=idProyectoFinalizar).all()
		
		exito = 'SI'
		for fase in fases:
			itemNoBloqueado = session.query(Item).filter(Item.fase_id==fase.id).filter(Item.estado!='BLOQUEADO').filter(Item.flagUltimo==1).filter(Item.flagBorrado==0).first()
			if itemNoBloqueado:
				exito = 'NO'
				break
		
		responseFinalizar = Response()
		if exito == 'SI':
			for fase in fases:
				fase.estado = 'FINALIZADA'
				
			proyectoFinalizar = session.query(Proyecto).filter_by(id=idProyectoFinalizar).first()
			proyectoFinalizar.estado = 'FINALIZADO'
			responseFinalizar.body = json.dumps(dict(success = True))
		else:
			responseFinalizar.body = json.dumps(dict(success = False, msg = 'No se puede finalizar el proyecto, existen items que no estan en una linea base!!!'))
		
		responseFinalizar.content_type = 'application/json'
		return responseFinalizar
		
	elif dicParametros.get('operacion') == 'viewEstadoProyecto':
		idProyecto = json.loads(request.params['idProyecto'])
		proyecto = session.query(Proyecto).filter_by(id=idProyecto).first()
		
		responseEstadoProyecto = Response()
		responseEstadoProyecto.body = json.dumps(dict(success = True, estado = proyecto.estado))
		responseEstadoProyecto.content_type = 'application/json'
		return responseEstadoProyecto
